home *** CD-ROM | disk | FTP | other *** search
- * ramdisk.s
-
- *------------------------------------------------------------------------
- * :
- * ST RAMDISK driver (M:) :
- * Conditional assembly for 128K/256K/360K/512K/720K/768K Ramdisk :
- * :
- * Original 128K/512K version by Landon Dyer of Atari Corp. :
- * :
- * Extensive modifications by: :
- * :
- * George R. Woodside :
- * 5219 San Feliciano Drive :
- * Woodland Hills, Ca. 91364 :
- * :
- * Public Domain (give it away, folks!) :
- * This program, or any work derived from it, may not be sold :
- * without permission from Atari Corp. :
- * :
- *---- :
- * Stick this program in the \AUTO folder of the boot volume. Or, :
- * you can simply double-click it after the desktop comes up. :
- * :
- *---- :
- * Note that the 360K and 720K options are special modes which :
- * exactly match standard format disks. :
- * :
- *---- :
- * 9-Aug-1985 lmd Hacked it up :
- * 9-Jan-1986 lmd Fixed sign-extension problem in _rw: and added :
- * conditional assembly for two kinds of ramdisk. :
- * 9-Jan-1986 lmd Make it "M:" :
- * 17-Mar-1986 grw Added 256K option :
- * 3-Apr-1986 grw Added 768K option :
- * 19-Sep-1986 grw Added 720K option, fixed FATs :
- * 19-Oct-1986 grw Added storage address to BPB :
- * 16-Nov-1986 grw Added 360K option, moved signon :
- * 7-Mar-1987 grw Added mediach, 400K and 800K options :
- * :
- *------------------------------------------------------------------------
-
- *
- * Flag to suppress signon message
- *
-
- _signon equ 1 ; 1 = show signon message
-
- *
- * Define one of the following to `1':
- *
-
- _128k equ 0 ; 128K ramdisk
- _256k equ 0 ; 256K ramdisk
- _360k equ 0 ; 360K ramdisk
- _400k equ 0 ; 400K ramdisk
- _512k equ 1 ; 512K ramdisk
- _720k equ 0 ; 720K ramdisk
- _768k equ 0 ; 768K ramdisk
- _800k equ 0 ; 800K ramdisk
-
- ifne _128k
- ramdisk_size equ $20000 ; size of 128K ramdisk
- endc
-
- ifne _256k
- ramdisk_size equ $40000 ; size of 256K ramdisk
- endc
-
- ifne _360k
- ramdisk_size equ $5A000 ; size of 360K ramdisk
- endc
-
- ifne _400k
- ramdisk_size equ $64000 ; size of 400K ramdisk
- endc
-
- ifne _512k
- ramdisk_size equ $80000 ; size of 512K ramdisk
- endc
-
- ifne _720k
- ramdisk_size equ $B4000 ; size of 720K ramdisk
- endc
-
- ifne _768k
- ramdisk_size equ $C0000 ; size of 768K ramdisk
- endc
-
- ifne _800k
- ramdisk_size equ $C8000 ; size of 800K ramdisk
- endc
-
- *
- * OS variables and vectors;
- * (stuff we have to subvert.)
- *
- *
-
- hdv_init equ $46a ; hdv_init()
- hdv_bpb equ $472 ; hdv_bpb(dev)
- hdv_rw equ $476 ; hdv_rw(rw, buf, count, recno, dev)
- hdv_boot equ $47a ; hdv_boot()
- hdv_mediach equ $47e ; hdv_mediach(dev)
- _drvbits equ $4c2 ; block device bitVector
- _dskbufp equ $4c6 ; pointer to common disk buffer
-
- *
- * Install driver;
- * setup ramdisk, then
- * terminate and stay resident.
- *
- *
- _start:
- move.l 4(sp),a4 ; a4 -> our basepage
- lea stack,a7 ; new user stack
- clr.l -(sp) ; get superuser mode
- move.w #$20,-(sp) ; set up the call
- trap #1 ; get there
- addq #6,sp ; restore stack
- move.l d0,-(sp) ; save old SSP on stack
- bsr _getvec ; load the vector tables
- move.w #$20,-(sp) ; back to user mode
- trap #1 ; (SSP already on the stack)
- addq #6,sp ; clean it up
- *
- *--- Do a signon message to let user know we are here.
- *
- ifne _signon
- bsr dspla ; display sign on message
- endc
-
- bsr _cmem ; compute memory size
-
- *
- *--- clear first 9K of ramdisk:
- *
- lea ramdisk(pc),a0 ; load ram buffer address
- move.w #$480-1,d0 ; load a counter
- clrit: clr.l (a0)+ ; erase a word
- clr.l (a0)+ ; and another
- dbra d0,clrit ; do 9K
- lea ramdisk+512(pc),a0 ; point to first FAT
- move.l #$f7ffff00,(a0) ; set normal FAT start
- lea ramdisk+3072(pc),a0 ; point to second FAT
- move.l #$f7ffff00,(a0) ; set normal FAT start
- *
- *--- terminate and stay resident
- *
- clr.w -(sp) ; return code of zero
- move.l d3,-(sp) ; # bytes to keep
- move.w #$31,-(sp) ; Ptermres()
- trap #1 ; do it
- illegal ; "cannot happen"
- *
- * LONG hbpb(dev) - return ptr to BPB (or NULL)
- *
- * Passed: dev 4(sp).W
- *
- *
-
- hbpb:
- move.w 4(sp),d0 ; d0 = devno
- move.l o_bpb,a0 ; a0 -> pass-through vector
- lea _bpb(pc),a1 ; a1 -> our handler
- bra check_dev ; do it
- *
- * LONG rw(rw, buf, count, recno, dev)
- *
- * Passed: dev $e(sp).W
- * recno $c(sp).W
- * count $a(sp).W
- * buf 6(sp).L
- * rw 4(sp).W
- *
-
- hrw:
- move.w $e(sp),d0 ; d0 = devno
- move.l o_rw,a0 ; a0 -> pass-through vector
- lea _rw(pc),a1 ; a1 -> our handler
- bra check_dev ; do it
- *
- * LONG mediach(dev)
- *
- * Passed: dev 4(sp).W
- *
-
- hmediach:
- move.w 4(sp),d0 ; d0 = devno
- move.l o_mediach,a0 ; a0 -> pass-through vector
- lea _mediach(pc),a1 ; a1 -> our handler
- *
- * check_dev - use handler, or pass vector through
- *
- * Passed: d0.w = device#
- * a0 -> old handler
- * a1 -> new handler
- * a5 -> $0000 (zero-page ptr)
- *
- * Jumps-to: (a1) if dev in range for this handler
- * (a0) otherwise
- *
-
- check_dev:
- cmp.w #12,d0 ; M:?
- bne chkd_f ; (no)
- move.l a1,a0 ; yes -- follow success vector
- chkd_f: jmp (a0) ; do it
-
- *
- * _bpb - return BPB for RAMDISK
- * Synopsis: LONG _bpb(dev)
- * WORD dev;
- *
- * Returns: NULL, or a pointer to the BPB buffer
- *
-
- _bpb:
- clr.l d0 ; get a zero
- move.l d0,mchflg ; clear media flag
- move.l #thebpb,d0 ; load the bpb address
- rts ; and return it
- *
- * _rw - read/write ramdisk sectors
- * Synopsis: _rw(rw, buf, count, recno, dev)
- *
- * Passed: dev $e(sp).W
- * recno $c(sp).W
- * count $a(sp).W
- * buf 6(sp).L
- * rw 4(sp).W
- *
-
- _rw:
- bsr _mediach ; test for media change
- beq _dorw ; not set, do read/write
- rts ; set, return error
- _dorw:
- lea ramdisk(pc),a0 ; a0 -> base of ramdisk
- moveq #0,d0 ; clear upper word of d0
- move.w $c(sp),d0 ; d0 = sect# << 9
- lsl.l #8,d0
- lsl.l #1,d0
- add.l d0,a0 ; a0 -> ramdisk mem
-
- moveq #0,d2 ; d2 = byte count / 32
- move.w $a(sp),d2 ; load the count
-
- move.l 6(sp),d0 ; d0 -> buffer
- bne _rrw0 ; we have an address
- ext.l d2 ; make mediach a long
- move.l d2,mchflg ; save the value
- bra _rrwq ; and return ok
-
- _rrw0:
- movea.l d0,a1 ; buffer address to a1
- lsl.l #4,d2 ; log2(512 / 32) = 4
- tst.w 4(sp) ; if (rw) exchange(a0, a1)
- beq _rrw1 ; a read
- exg a0,a1 ; swap src & dest
-
- _rrw1:
- move.l (a0)+,(a1)+ ; move 32 bytes
- move.l (a0)+,(a1)+
- move.l (a0)+,(a1)+
- move.l (a0)+,(a1)+
- move.l (a0)+,(a1)+
- move.l (a0)+,(a1)+
- move.l (a0)+,(a1)+
- move.l (a0)+,(a1)+
- subq.l #1,d2 ; while (--d2)
- bmi _rrwq
- bne _rrw1
-
- _rrwq: clr.l d0 ; return OK
- rts
- *
- * _mediach - return media change
- * Synopsis: _mediach(dev)
- * WORD dev;
- *
- * Returns: 0L
- *
-
- _mediach:
- move.l mchflg,d0 ; get the flag
- beq _gotmc ; not set
- move.l #-14,d0 ; load media has changed
- _gotmc:
- rts ; and return status
-
- *
- * BPB for ramdisk
- *
-
- thebpb:
- dc.w 512 ; #bytes/sector
- dc.w 2 ; #sectors/cluster
- dc.w 1024 ; #bytes/cluster
- dc.w 7 ; rdlen (112 files)
- dc.w 5 ; fat size
- dc.w 6 ; 2nd FAT start
- dc.w 18 ; 1st cluster start
- ifne _128k
- dc.w 124 ; #clusters (128K)
- endc
- ifne _256k
- dc.w 250 ; #clusters (256K)
- endc
- ifne _360k
- dc.w 351 ; #clusters (360K)
- endc
- ifne _400k
- dc.w 391 ; #clusters (400K)
- endc
- ifne _512k
- dc.w 503 ; #clusters (512K)
- endc
- ifne _720k
- dc.w 711 ; #clusters (720K)
- endc
- ifne _768k
- dc.w 759 ; #clusters (768K)
- endc
- ifne _800k
- dc.w 791 ; #clusters (800K)
- endc
-
- dc.w 0 ; flags (12-bit FATs)
- dc.l ramdisk ; leave buffer address
- dc.l $1234543 ; magic number
-
- o_init: dc.l 0 ; old hdv_init
- o_bpb: dc.l 0 ; old hdv_bpb
- o_rw: dc.l 0 ; old hdv_rw
- o_mediach: dc.l 0 ; old hdv_mediach
- mchflg: dc.l 0 ; media change flag
- even
-
- ramdisk: dc.w 0 ; beginning of Ramdisk
- stack equ ramdisk+ramdisk_size
-
- *
- * Put the signon message here, so that after being displayed,
- * it is used as part of the RAMdisk memory allocation.
- *
-
- dspla:
- pea message(pc) ; print something informative
- move.w #9,-(sp)
- trap #1
- addq #6,sp
- rts
-
- ifne _128k
- message: dc.b '128K'
- endc
-
- ifne _256k
- message: dc.b '256K'
- endc
-
- ifne _360k
- message: dc.b '360K'
- endc
-
- ifne _400k
- message: dc.b '400K'
- endc
-
- ifne _512k
- message: dc.b '512K'
- endc
-
- ifne _720k
- message: dc.b '720K'
- endc
-
- ifne _768k
- message: dc.b '768K'
- endc
-
- ifne _800k
- message: dc.b '800K'
- endc
-
- dc.b ' RAMDISK installed as M:'
- dc.b 13,10
- dc.b 'version 3/9/87 lmd/grw.'
- dc.b 13,10
- dc.b 0
-
- _getvec:
- bset.b #4,_drvbits+2 ; set bit for M:
- clr.l a5 ; easy zero-based pointer
- move.l hdv_bpb(a5),o_bpb ; save old disk vectors
- move.l hdv_rw(a5),o_rw
- move.l hdv_mediach(a5),o_mediach
- move.l #hbpb,hdv_bpb(a5) ; install ramdisk's vectors
- move.l #hrw,hdv_rw(a5)
- move.l #hmediach,hdv_mediach(a5)
- rts ; and go back
-
- *
- *--- compute size of memory we want to keep:
- *
- _cmem:
- move.l #ramdisk,d3 ; d3 = end of text
- subi.l #_start,d3 ; d3 = length of text
- add.l $14(a4),d3 ; d3 += size of data
- add.l $1c(a4),d3 ; d3 += size of bss
- add.l #$0100,d3 ; d3 += size of basepage
- add.l #ramdisk_size,d3 ; d3 += size of ramdisk
- rts ; and return
-